home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / gfx / edit / AmiCAD_2.07.lha / AmiCAD / ARexx / SaveNets.AmiCAD < prev    next >
Text File  |  2000-11-29  |  16KB  |  548 lines

  1. /* Élaboration d'une netlist, appel simulateur analogique Spice
  2.    Version 1.00: 14-07-98
  3.    Version 1.01: 16-02-99 (modif ASKTEXT)
  4.    Version 1.02: 21/02/99 (modif REQFILE, ajout UNLOCK)
  5.    Version 1.03: 27/02/99 (ajout INIT variables)
  6.    Version 1.04: 29/05/99 (ajout signal si absence de masse)
  7.    Version 1.05: 06/06/99 (ajout traitement .OUTPUT)
  8.    Version 1.06: 04/10/99 (ajout point de fonctionnement)
  9.    Version 1.07: 13/04/00 (adaptation à la version 2.05)
  10.    Version 1.08: 11/11/00 (localisation anglais/français)
  11.    Ne teste que les lignes horizontales ou verticales (pour les intersections)
  12.    $VER: SaveNets 1.08 (© R.Florac, 11/11/2000) */
  13.  
  14. options results     /* indispensable pour récupérer le résultat des macros */
  15.  
  16. signal on error     /* pour l'interception des erreurs */
  17. signal on syntax
  18.  
  19. 'LANGUAGE'
  20. if result="français.language" then fr=1
  21. else fr=0
  22.  
  23. 'OBJECTS'
  24. if result=0 then do
  25.     if fr=1 then 'MESSAGE("Il n''y a aucun objet"+CHR(10)+"sur ce document !")'
  26.     else  'MESSAGE("There is no objet"+CHR(10)+"on this document !")'
  27.     exit
  28. end
  29.  
  30. call 'ARexx/InitObjets.AmiCAD'
  31.  
  32. /* Test des liaisons */
  33. j=1; nets=1;
  34. 'DEF NEXTJUNCTION(O)=OO=O:WHILE(IF(OO>0,TYPE(OO)<>7,0),IF(OO<OBJECTS,OO=OO+1,OO=0)):OO'
  35. 'INIT(O,OO,I,X,V0,V1,B):UNMARK(-1):LOCK:OBJECTS'; objets=result
  36. /* Tableaux de données:
  37. equi: une donnée par élément, donne l'indice de l'équipotentielle à laquelle est liée une ligne
  38. label: une donnée par équipotentielle, donne son nom */
  39. equi.=-1
  40. label.=""
  41.  
  42. if fr=1 then 'TITLE("Lecture des labels...")'
  43. else 'TITLE("Reading labels...")'
  44. do i=1 to objets
  45.     'TYPE(O='i')'
  46.     if result=4 | result=12 | result=11 then do
  47.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  48.     if j>0 then do
  49.         'READTEXT(O)'; label=result
  50.         if datatype(label,"w") then do      /* signale les labels numériques existants */
  51.         label.label="LABEL_DÉJÀ_UTILISÉ"
  52.         end
  53.     end
  54.     end
  55. end
  56.  
  57. if fr=1 then 'TITLE("Analyse des liaisons...")'
  58. else 'TITLE("Checking wires...")'
  59. i=1
  60. do while i>0
  61.     'OO=FINDOBJ('i',FIL,-1,-1)'; i=result
  62.     if result>0 then do
  63.     'TEST(OO)'
  64.     if result=0 then do
  65.         do while label.nets~=""
  66.         nets=nets+1
  67.         end
  68.         label.nets=nets
  69.         equi.i=nets
  70.         'COORDS(OO)'            /* Marquage du fil */
  71.         parse var result x0','y0','x1','y1
  72.         call test_ligne(x0,y0,nets,objets)
  73.         call test_ligne(x1,y1,nets,objets)
  74.     end
  75.     if i=objets then i=0
  76.     else i=i+1
  77.     end
  78. end
  79.  
  80. if fr=1 then 'TITLE("Analyse des jonctions...")'
  81. else 'TITLE("Checking junctions...")'
  82. i=1
  83. do while i>0
  84.     'I=FINDOBJ('i',JONCTION,-1,-1)'; i=result
  85.     if i>0 then do
  86.     'MARK(I):L1=ABS(FINDLINE(1,COL(I),LINE(I)))'; l1=result
  87.     if l1>0 & l1<objets then do
  88.         j=l1+1
  89.         do while j>0
  90.         'J=ABS(FINDLINE('j',COL(I),LINE(I)))'; j=result
  91.         if j>0 then do
  92.             if equi.j~=equi.l1 then do
  93.             call changer_labels(l1,j)
  94.             end
  95.             if j=objets then j=0
  96.             else j=j+1
  97.         end
  98.         end
  99.     end
  100.     if i=objets then i=0
  101.     else i=i+1
  102.     end
  103. end
  104.  
  105. if fr=1 then 'TITLE("Recherche des labels et des connecteurs...")'
  106. else 'TITLE("Searching labels and connectors...")'
  107. do i=1 to objets
  108.     'TYPE(O='i')'
  109.     if result=4 | result=12 | result=11 then do
  110.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  111.     if j>0 then do
  112.         net=equi.j
  113.         'READTEXT(O)'; label=result
  114.         label.net=label
  115.     end
  116.     end
  117. end
  118.  
  119. if fr=1 then 'TITLE("Recherche des alimentations...")'
  120. else 'TITLE("Searching powers...")'
  121. do i=1 to objets
  122.     'FINDPART('i',"ALIMENTATION")'; i=result
  123.     if i>0 then do
  124.     j=connexion_broche(i,1)
  125.     if j>0 then do
  126.         net=equi.j
  127.         'READTEXT(GETVAL('i'))'; label=result
  128.         label.net=label
  129.     end
  130.     end
  131.     else leave
  132. end
  133.  
  134. if fr=1 then 'TITLE("Test redondances...")'
  135. else 'TITLE("Checking redundancies...")'
  136. do i=1 to nets
  137.     do j=i+1 to nets
  138.     if label.j~="" then do
  139.         if label.i=label.j then do
  140.         do k=1 to objets
  141.             if equi.k=j then equi.k=i
  142.         end
  143.         label.j=""
  144.         end
  145.     end
  146.     end
  147. end
  148.  
  149. if fr=1 then 'TITLE("Recherche des masses...")'
  150. else 'TITLE("Searching grounds...")'
  151. do i=1 to objets
  152.     'FINDPART('i',"MASSE")'; i=result
  153.     if i>0 then do
  154.     j=connexion_broche(i,1)
  155.     if j>0 then do
  156.         equi.0=0; label.0=0
  157.         call changer_labels(0,j)
  158.     end
  159.     end
  160.     else leave
  161. end
  162.  
  163. masse=0
  164. do i=0 to nets
  165.     if label.i=0 then do
  166.     masse=1
  167.     leave i
  168.     end
  169. end
  170.  
  171. if masse=0 then do
  172.     if fr=1 then 'REQUEST("Attention: le circuit"+CHR(10)+"ne possède pas de masse!"+CHR(10)+"Sa simulation sera impossible"+CHR(10)+"Voulez-vous continuer?")'
  173.     else 'REQUEST("Warning: the circuitry"+CHR(10)+"has no ground line!"+CHR(10)+"Its simulation will be impossible"+CHR(10)+"Do-you want to continue?")'
  174.     if result<1 then exit
  175. end
  176.  
  177. do until c=0
  178.     if fr=1 then 'TITLE("Établissement équipotentielles terminé"):SELECT("Choisissez une action"+CHR(10)+"Visualiser les équipotentielles"+CHR(10)+"Contrôler la netlist"+CHR(10)+"Sauver la netlist"+CHR(10)+"Abandonner ce script")'
  179.     else 'TITLE("Checking circuitry finished"):SELECT("Choose an action"+CHR(10)+"Display the nodes"+CHR(10)+"Check the netlist"+CHR(10)+"Save the netlist"+CHR(10)+"Stop this script")'
  180.     select
  181.     when result=1 then call visu_equi
  182.     when result=2 then call controler_netlist
  183.     when result=3 then call sauver_netlist
  184.     otherwise c=0
  185.     end
  186. end
  187. 'UNMARK(-1):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  188. exit
  189.  
  190. visu_equi:
  191.     if fr=1 then 'TITLE("Vérification équipotentielles"):UNMARK(-1)'
  192.     else 'TITLE("Checking nodes"):UNMARK(-1)'
  193.     do i=0 to nets
  194.     if label.i ~= "LABEL_DÉJÀ_UTILISÉ" & label.i ~= "" then do
  195.         do j=1 to objets
  196.         if equi.j=i then 'MARK('j')'
  197.         end
  198.         if fr=1 then 'SELECT("Équipotentielle 'label.i'"+CHR(10)+"Abandonner"+CHR(10)+"Continuer"+CHR(10)+"Sauver netlist"+CHR(10)+"Contrôler netlist")'
  199.         else 'SELECT("Node 'label.i'"+CHR(10)+"Stop"+CHR(10)+"Continue"+CHR(10)+"Save netlist"+CHR(10)+"Check netlist")'
  200.         if result <= 1 then return
  201.         if result = 3 then do
  202.         call sauver_netlist
  203.         'UNMARK(-1):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  204.         exit
  205.         end
  206.         if result = 4 then do
  207.         call controler_netlist
  208.         leave
  209.         end
  210.         'UNMARK(-1)'
  211.     end
  212.     end
  213.     return
  214.  
  215. test_ligne: procedure expose equi.
  216.     parse arg x0,y0,n,nbo
  217.     o=1
  218.     do until o=0
  219.     'X=FINDOBJ('o',FIL,'x0','y0')'; o=result
  220.     if o>0 then do
  221.         'IF(TEST(X),"",MARK(X):COORDS(X))'
  222.         if result~="" then do
  223.         parse var result x1','y1','x2','y2
  224.         equi.o=n
  225.         if x0=x1 & y0=y1 then call test_ligne(x2,y2,n,nbo)
  226.         else call test_ligne(x1,y1,n,nbo)
  227.         end
  228.         if o=nbo then o=0
  229.         else o=o+1
  230.     end
  231.     end
  232.     return
  233.  
  234. changer_labels: procedure expose equi. objets label.
  235.     parse arg o1,o2
  236.     if datatype(equi.o2,'w') then do
  237.     e=equi.o2
  238.     label.e=""
  239.     do i=1 to objets
  240.         if equi.i=e then equi.i=equi.o1
  241.     end
  242.     return o1
  243.     end
  244.     else do
  245.     e=equi.o1
  246.     label.e=""
  247.     do i=1 to objets
  248.         if equi.i=e then equi.i=equi.o2
  249.     end
  250.     return o2
  251.     end
  252.     return
  253.  
  254. test_jonction: procedure expose equi.
  255.     parse arg xj,yj,n,objets
  256.     obj=1
  257.     do while obj>0
  258.     'X=ABS(FINDLINE('obj','xj','yj'))'; obj=result
  259.     if obj>0 then do
  260.         if equi.obj=n then return 1
  261.         if obj=objets then return 0
  262.         obj=obj+1
  263.     end
  264.     end
  265.     return 0
  266.  
  267. controler_netlist:
  268.     if fr=1 then 'TITLE("Contrôle netlist...")'
  269.     else 'TITLE("Checking netlist...")'
  270.     i=1
  271.     do while i>0
  272.     'O=FINDOBJ('i',COMPOSANT,-1,-1)'; i=result
  273.     if i>0 then do
  274.         'PARTNAME(O)'
  275.         if result~="ALIMENTATION" & result ~="MASSE" then do
  276.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  277.         ligne=translate(result,"_"," ")||' '
  278.         'DEVPINS(O)'; j=result
  279.         do k=1 to j
  280.             l=connexion_broche(i,k)
  281.             if l>0 then do
  282.             net=equi.l
  283.             ligne=ligne||label.net||' '
  284.             end
  285.             else ligne=ligne||"-1"||' '
  286.         end
  287.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  288.         ligne=ligne||result
  289.         if fr=1 then 'UNMARK(-1):MARK(O):SELECT("'ligne'"+CHR(10)+"Continuer"+CHR(10)+"Abandonner")'
  290.         else 'UNMARK(-1):MARK(O):SELECT("'ligne'"+CHR(10)+"Continue"+CHR(10)+"Stop")'
  291.         if result~=1 then return
  292.         end
  293.         if i=objets then leave
  294.         i=i+1
  295.     end
  296.     end
  297.     'TITLE("")'
  298. return
  299.  
  300. sauver_netlist:
  301.     if fr=1 then 'TITLE(""):REQFILE("Fichier netlist à créer","Spice",FILEPART("")+".cir")'
  302.     else 'TITLE(""):REQFILE("Netlist file to create","Spice",FILEPART("")+".cir")'
  303.     fichier=result
  304.     if fichier="" then return
  305.     if fr=1 then 'TITLE("Sauvegarde netlist...")'
  306.     else 'TITLE("Saving netlist...")'
  307.     if ~open(file, fichier, 'W') then return
  308.     'FILEPART("")'
  309.     writeln(file,result)
  310.     if fr=1 then do
  311.     'DATE(1)+" à "+TIME(1)'
  312.     writeln(file,"* Créé par AmiCAD, le "||result||" *")
  313.     writeln(file,".include Travail:Spice3f5/lib/modeles.cir")
  314.     end
  315.     else do
  316.     'DATE(1)+" "+TIME(1)'
  317.     writeln(file,"* Created by AmiCAD, on "||result||" *")
  318.     writeln(file,".include Work:Spice3f5/lib/modeles.cir")
  319.     end
  320.     do i=1 to objets
  321.     'O=FINDOBJ('i',COMPOSANT,-1,-1)'; i=result
  322.     if result>0 then do
  323.         'PARTNAME(O)'
  324.         if result~="ALIMENTATION" & result ~="MASSE" then do
  325.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  326.         ligne=translate(result,"_"," ")||' '
  327.         'DEVPINS(O)'; j=result
  328.         do k=1 to j
  329.             l=connexion_broche(i,k)
  330.             if l>0 then do
  331.             net=equi.l
  332.             ligne=ligne||label.net||' '
  333.             end
  334.             else ligne=ligne||"-1"||' '
  335.         end
  336.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  337.         ligne=ligne||result
  338.         call writeln(file, ligne)
  339.         end
  340.     end
  341.     else leave i
  342.     end
  343.     analyse=""
  344.     do i=1 to objets
  345.     'FINDOBJ('i',TEXTE,-1,-1)'; i=result
  346.     if i>0 then do
  347.         'READTEXT('i')'; t=result
  348.         if left(t,10)=".ANALYSE: " then do
  349.         analyse=substr(t,11)
  350.         end
  351.     end
  352.     else leave
  353.     end
  354.     if analyse="" then do
  355.     if fr=1 then 'SELECT("Type d''analyse à effectuer"+CHR(10)+"Point de fonctionnement"+CHR(10)+"AC"+CHR(10)+"DC"+CHR(10)+"Transient")'
  356.     else 'SELECT("Analyse type to do"+CHR(10)+"Operating point"+CHR(10)+"AC"+CHR(10)+"DC"+CHR(10)+"Transient")'
  357.     select
  358.         when result=1 then do
  359.         analyse="OP"
  360.         end
  361.         when result=2 then do
  362.         if fr=1 then 'SELECT("Type de variation"+CHR(10)+"Décade"+CHR(10)+"Octave"+CHR(10)+"Linéaire")'
  363.         else 'SELECT("Variation"+CHR(10)+"Decade"+CHR(10)+"Octave"+CHR(10)+"Linear")'
  364.         select
  365.             when result=1 then do
  366.             f="DEC "
  367.             if fr=1 then v="par décade"
  368.             else v="by decade"
  369.             end
  370.             when result=2 then do
  371.             f="OCT "
  372.             if fr=1 then v="par octave"
  373.             else v="by octave"
  374.             end
  375.             when result=3 then do
  376.             f="LIN "
  377.             if fr=1 then v="de test"
  378.             else v="of test"
  379.             end
  380.             otherwise do
  381.             close(file)
  382.             return
  383.             end
  384.         end
  385.         if fr=1 then 'ASKNUM("Nombre de points 'v'?",100)'
  386.         else 'ASKNUM("Number of points 'v'?",100)'
  387.         f=f||result
  388.         if fr=1 then 'ASKTEXT("Quelle est la fréquence de début?","10")'
  389.         else 'ASKTEXT("Beginning frequency ?","10")'
  390.         f=f||" "||result
  391.         if fr=1 then 'ASKTEXT("Quelle est la fréquence de fin?","100")'
  392.         else 'ASKTEXT("Ending frequency ?","100")'
  393.         analyse="AC "||f||' '||result
  394.         end
  395.         when result=3 then do
  396.         if fr=1 then do
  397.             'UNMARK(-1):MESSAGE("Vous devez maintenant"+CHR(10)+"sélectionner une source")'
  398.             'PICKOBJ("Sélectionnez le générateur à faire varier.")'
  399.         end
  400.         else do
  401.             'UNMARK(-1):MESSAGE("Now you must"+CHR(10)+"select a source")'
  402.             'PICKOBJ("Select the generator to be swept.")'
  403.         end
  404.         f=result
  405.         if f<1 then return
  406.         'MARK('f'):TYPE('f')'
  407.         if result=5 then 'READTEXT('f')'
  408.         else 'READTEXT(GETREF('f'))'
  409.         f=result
  410.         if fr=1 then 'V0=ASKTEXT("Quelle est la valeur de départ?","V")'
  411.         else 'V0=ASKTEXT("Beginning value ?","V")'
  412.         f=f||' '||result
  413.         if fr=1 then 'V1=ASKTEXT("Quelle est la valeur finale ?","V")'
  414.         else 'V1=ASKTEXT("Ending value ?","V")'
  415.         f=f||' '||result
  416.         if fr=1 then 'ASKTEXT("Quel est l''incrément?",STR((VAL(V1)-VAL(V0))/100)+"V")'
  417.         else 'ASKTEXT("Increment value ?",STR((VAL(V1)-VAL(V0))/100)+"V")'
  418.         analyse="DC "||f||' '||result
  419.         end
  420.         when result=4 then do
  421.         if fr=1 then do
  422.             'ASKTEXT("Temps de simulation?","s")'; temps=result
  423.             'ASKTEXT("Pas de simulation?","s")'; pas=result
  424.             'ASKTEXT("Temps de début de la simulation?","s")'; d=result
  425.         end
  426.         else do
  427.             'ASKTEXT("Time of simulation?","s")'; temps=result
  428.             'ASKTEXT("Simulation step ?","s")'; pas=result
  429.             'ASKTEXT("Time delay before simulation ?","s")'; d=result
  430.         end
  431.         analyse="tran "||pas||" "||temps||" "||d
  432.         end
  433.         otherwise
  434.         return
  435.     end
  436.     end
  437.     if analyse~="" then writeln(file,"."||analyse)
  438.     i=1
  439.     s=''
  440.     do i=1 to objets
  441.     'FINDOBJ('i',TEXTE,-1,-1)'; i=result
  442.     if i>0 then do
  443.         'READTEXT('i')'; t=result
  444.         if left(t,9)=".OUTPUT: " then do
  445.         s=substr(t,9)
  446.         end
  447.     end
  448.     else leave
  449.     end
  450.     if s='' then do
  451.     if fr=1 then 'UNMARK(-1):MESSAGE("Vous pouvez maintenant"+CHR(10)+"spécifier quels sont les"+CHR(10)+"signaux à visualiser"+CHR(10)+"Appuyez sur le bouton"+CHR(10)+"droit pour arrêter")'
  452.     else 'UNMARK(-1):MESSAGE("Now you can specify"+CHR(10)+"what labels are to be displayed"+CHR(10)+"Click on the right button"+CHR(10)+"to stop.")'
  453.     i=1
  454.     do while i>0
  455.         if fr=1 then 'PICKOBJ("Sélectionnez un signal (label ou liaison)")'
  456.         else 'PICKOBJ("Select a label (or a wire)")'
  457.         i=result
  458.         if i>0 then do
  459.         'MARK('i'):TYPE('i')'; t=result
  460.         if t=2 then do
  461.             lab=equi.i
  462.             lab=label.lab
  463.         end
  464.         else do
  465.             'READTEXT('i')'
  466.             lab=result
  467.         end
  468.         if i>0 then s=s||' '||'V('||lab||')'
  469.         end
  470.     end
  471.     end
  472.     if s~='' then writeln(file,".save"||s)
  473.     writeln(file,".END")
  474.     close(file)
  475.     if fr=1 then 'TITLE(""):REQUEST("Sauvegarde terminée"+CHR(10)+"Voulez-vous effectuer"+CHR(10)+"la simulation?")'
  476.     else 'TITLE(""):REQUEST("Saving finished"+CHR(10)+"Do you want to run"+CHR(10)+"the simulation ?")'
  477.     if result=1 then do
  478.     if analyse ~= "OP" then do
  479.         if fr=1 then do        /* French version */
  480.         'REXXPORT("Tracé "+FILEPART(""))'
  481.         port=result
  482.         if port="" then do
  483.             'FILEPART("")'
  484.             call 'Travail:AmiCAD/ARexx/NewWindow' 'Tracé '||result
  485.             code=result
  486.             if code < 0 then do
  487.             'MESSAGE("Ouverture fenêtre tracé impossible"):UNLOCK'
  488.             exit
  489.             end
  490.             port = 'AmiCAD.'||code
  491.         end
  492.         end
  493.         else do            /* English version */
  494.         'REXXPORT(FILEPART("")+" Trace")'
  495.         port=result
  496.         if port="" then do
  497.             'FILEPART("")'
  498.             call 'Work:AmiCAD/ARexx/NewWindow' result||" Trace"
  499.             code=result
  500.             if code < 0 then do
  501.             'MESSAGE("Opening trace window error"):UNLOCK'
  502.             exit
  503.             end
  504.             port = 'AmiCAD.'||code
  505.         end
  506.         end
  507.         'UNLOCK'
  508.         address value port
  509.     end
  510.     else port=""
  511.     'CALL("Simulation.AmiCAD","'fichier'")'
  512.     'CALL("TracerSpice.AmiCAD","RAM:'ParseFileName(fichier)'_spice'port'")'
  513.     exit
  514.     end
  515. return
  516.  
  517. connexion_broche: procedure
  518.     parse arg objet,broche
  519.     'PINCOL(O='objet',B='broche')'; xj=result
  520.     'PINLINE(O,B)'; yj=result
  521.     'FINDOBJ(1,FIL,'xj','yj')'; xl=result   /* Il y a t'il une ligne qui part de la broche? */
  522.     if xl>0 then return xl
  523.     'FINDLINE(1,'xj','yj')'; xl=result      /* Il y a peut être une ligne qui passe sur la broche... */
  524.     if xl<=0 then return 0
  525.     'FINDOBJ(1,JONCTION,'xj','yj')'         /* Il doit alors y avoir une jonction */
  526.     if result>0 then return xl
  527.     return 0
  528.  
  529. ParseFileName: procedure
  530.     parse arg FilePath, Part
  531.     DivPos = max(lastpos(':',FilePath),lastpos('/',FilePath))+1
  532.     if abbrev('FILE', upper(Part))
  533.     then return substr(FilePath, DivPos)
  534.     else
  535.     return strip(left(FilePath, DivPos-1),'T','/')
  536.  
  537. /* Traitement des erreurs, interruption du programme */
  538. syntax:
  539. erreur=RC
  540. if fr=1 then 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  541. else 'MESSAGE("SaveNets.AmiCAD script"+CHR(10)+"Syntax error"+CHR(10)+"in line 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  542. exit
  543.  
  544. error:
  545. if fr=1 then 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur en ligne 'SIGL'"):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  546. else 'MESSAGE("SaveNets.AmiCAD script"+CHR(10)+"Error in line 'SIGL'"):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  547. exit
  548.